package cn.biplam.front.htmlscript.script;

import java.util.Map;

import cn.biplam.common.paramters.SysName;
import cn.biplam.common.paramters.TreeParam;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;
import cn.biplam.front.html.base.HtmlWindow;
import cn.biplam.front.html.base.Const.Window_Event;
import cn.biplam.front.htmlscript.script.AjxScript.Is_AddParam;
import cn.biplam.front.htmlscript.script.AjxScript.Is_RefreshParent;
import cn.biplam.front.htmlscript.script.ScriptPrompt.Close_Prompt;

/**
 * 自定义提交脚本
 * @author WangSong 2009-7-22下午12:03:30
 * @version 1.0
 */
public class ScriptCustomer {

	/**
	 * 算术表达式维护按钮事件
	 * @param cId 容器id
	 * @param aId 行为id
	 * @param optType  按钮的操作类型
	 * @return
	 */
	public static String getArithManageButton(String cId,
			String aId,
			String optType,
			String treeIndex){
		StringBuilder sb = new StringBuilder();
		sb.append("$('h,"+cId+"arithOpt').value='"+optType+"';");
		sb.append("$('h,"+cId+TreeParam.TREE_INDEX+"').value='"+treeIndex+"';");
		sb.append(AjxScript.getSpParams(cId, aId, cId, new KvMap<String, String>()));
		return sb.toString();
	}

	/**
	 * 数据源新建修改的提交（弹出窗口内的数据提交/同步）
	 *  提交之前对数据源信息进行检查
	 * @param div    要绑定脚本的容器
	 * @param sCid   容器id
	 * @param sAid   行为id
	 * @param pid    父容器id
	 * @param flag   是否提交数据 0:不提交 1:提交
	 * @param ridCheckFlag ridCheckFlag:1检查rid 0不检查rid，并把函数的多余参数增加到param中
	 * @param otherParam:用参数名,参数值的方式 如 rid,1001
	 * @return
	 * @throws ErrorMessage 
	 */
	public static void getDbsSubmitCheckInput(HtmlWindow div,
			String sCid,
			String sAid,
			Close_Prompt closePrompt) throws ErrorMessage{
		StringBuilder script = new StringBuilder();
		StringBuilder scriptSubmit = new StringBuilder();
		//scriptSubmit.append(AjxScript.getSp(sCid, sAid, pid, flag, ridCheckFlag, otherParam));
		scriptSubmit.append(AjxScript.getSpNoRefresh(sCid, sAid));
		if(closePrompt==Close_Prompt.Close){
			scriptSubmit.append(PopupScript.cancel(SysName.PromptID));
		}
		script.append("if(dbsSubmitcheck()){");
		script.append(scriptSubmit.toString());
		script.append("};");
		div.bind(SysName.PromptSubmitID,Window_Event.OnClick,script.toString());
	}

	/**
	 *  具有参数检查的SP提交（弹出窗口内的数据提交/同步）脚本
	 *  提交之前对数据源信息进行检查(通用的。如果有特殊逻辑的需要自己实现，如上getDbsSubmitCheckInput())
	 *  用于只需要检查单个输入的情况
	 * @param inputName  输入框页面ID
	 * @param alertInfo  提示信息
	 * @param div
	 * @param sCid   容器id
	 * @param sAid   行为id
	 * @param pid    父容器id
	 * @param flag   是否提交数据 0:不提交 1:提交
	 * @param ridCheckFlag ridCheckFlag:1检查rid 0不检查rid，并把函数的多余参数增加到param中
	 * @param otherParam:用参数名,参数值的方式 如 rid,1001
	 * @throws ErrorMessage
	 */
	public static String getSpSubmitCheckInputString(String inputName,
			String alertInfo,
			String sCid,
			String sAid,
			String pid,
			Is_RefreshParent flag,
			Is_AddParam ridCheckFlag,
			String ... otherParam) throws ErrorMessage{
		KvMap<String, String> field = new KvMap<String, String>();
		field.put(inputName, alertInfo);
		return getSpSubmitCheckInputString(inputName, alertInfo, sCid, sAid, pid, flag,
				ridCheckFlag, otherParam);
	}

	/**
	 * 具有参数检查的SP提交（弹出窗口内的数据提交/同步）脚本
	 *  提交之前对数据源信息进行检查(通用的。如果有特殊逻辑的需要自己实现，如上getDbsSubmitCheckInput())
	 * @param checkField (需要检查的表单名称,提示信息)组成的键值对
	 * @param sCid   容器id
	 * @param sAid   行为id
	 * @param pid    父容器id
	 * @param flag   是否提交数据 0:不提交 1:提交
	 * @param ridCheckFlag ridCheckFlag:1检查rid 0不检查rid，并把函数的多余参数增加到param中
	 * @param otherParam:用参数名,参数值的方式 如 rid,1001
	 * @return
	 * @throws ErrorMessage 
	 */
	public static String getSpSubmitCheckInputString(
			KvMap<String,String> checkField,
			String sCid,
			String sAid) throws ErrorMessage{
		KvMap<Integer, String[]> fieldMap = new KvMap<Integer, String[]>();
		int i = 0;
		String [] fieldDesc = null;
		for(Map.Entry<String, String> field:checkField){
			fieldDesc = new String[2];
			fieldDesc[0] = field.getKey();
			fieldDesc[1] = field.getValue();
			fieldMap.put(i++, fieldDesc);
		}
		return getSpSubmitCheckInputString(fieldMap, true, sCid, sAid);
	}
	
	/**
	 * 具有参数检查的SP提交（弹出窗口内的数据提交/同步）脚本
	 *  提交之前对数据源信息进行检查(通用的。如果有特殊逻辑的需要自己实现，如上getDbsSubmitCheckInput())
	 * @param checkField<Integer,Sting[]{表单名称,为空的提示信息}>  需要检查的字段
	 * @param div    要绑定脚本的容器
	 * @param sCid   容器id
	 * @param sAid   行为id
	 * @param pid    父容器id
	 * @param flag   是否提交数据 0:不提交 1:提交
	 * @param ridCheckFlag ridCheckFlag:1检查rid 0不检查rid，并把函数的多余参数增加到param中
	 * @param otherParam:用参数名,参数值的方式 如 rid,1001
	 * @return
	 * @throws ErrorMessage 
	 */
	public static String getSpSubmitCheckInputString(KvMap<Integer,String[]> checkField,
			boolean type,
			String sCid,
			String sAid) throws ErrorMessage{
		StringBuilder scriptSubmit = new StringBuilder();
		//scriptSubmit.append(AjxScript.getSp(sCid, sAid, pid, flag, ridCheckFlag, otherParam));
		scriptSubmit.append(AjxScript.getSpNoRefresh(sCid, sAid));
		return empytCheck(checkField, scriptSubmit.toString());
	}
	
	/**
	 * 具有参数检查的SP提交（弹出窗口内的数据提交/同步）弹出窗口帮定脚本
	 *  提交之前对数据源信息进行检查(通用的。如果有特殊逻辑的需要自己实现，如上getDbsSubmitCheckInput())
	 * @param div 要绑定脚本的容器
	 * @param checkField (需要检查的表单名称,提示信息)组成的键值对
	 * @param sCid   容器id
	 * @param sAid   行为id
	 * @param pid    父容器id
	 * @param flag   是否提交数据 0:不提交 1:提交
	 * @param ridCheckFlag ridCheckFlag:1检查rid 0不检查rid，并把函数的多余参数增加到param中
	 * @param otherParam:用参数名,参数值的方式 如 rid,1001
	 * @return
	 * @throws ErrorMessage 
	 */
	public static void getSpSubmitCheckInput(
			HtmlWindow div,
			KvMap<String,String> checkField,
			String sCid,
			String sAid,
			Close_Prompt closePrompt) throws ErrorMessage{
		KvMap<Integer, String[]> fieldMap = new KvMap<Integer, String[]>();
		int i = 0;
		String [] fieldDesc = null;
		for(Map.Entry<String, String> field:checkField){
			fieldDesc = new String[2];
			fieldDesc[0] = field.getKey();
			fieldDesc[1] = field.getValue();
			fieldMap.put(i++, fieldDesc);
		}
		getSpSubmitCheckInput(fieldMap, div, sCid, sAid,closePrompt);
	}

	/**
	 * 数据源新建修改的提交（弹出窗口内的数据提交/同步）弹出窗口帮定脚本
	 *  提交之前对数据源信息进行检查(通用的。如果有特殊逻辑的需要自己实现，如上getDbsSubmitCheckInput())
	 * @param checkField<Integer,Sting[]{表单名称,为空的提示信息}>  需要检查的字段
	 * @param div    要绑定脚本的容器
	 * @param sCid   容器id
	 * @param sAid   行为id
	 * @param pid    父容器id
	 * @param closePrompt 提交后是否关闭窗口
	 * @return
	 * @throws ErrorMessage 
	 */
	public static void getSpSubmitCheckInput(KvMap<Integer,String[]> checkField,
			HtmlWindow div,
			String sCid,
			String sAid,
			Close_Prompt closePrompt) throws ErrorMessage{
		StringBuilder scriptSubmit = new StringBuilder();
		//scriptSubmit.append(AjxScript.getSp(sCid, sAid, pid, flag, ridCheckFlag, otherParam));
		scriptSubmit.append(AjxScript.getSpNoRefresh(sCid, sAid));
		if(closePrompt==Close_Prompt.Close){
			scriptSubmit.append(PopupScript.cancel(SysName.PromptID));
		}
		String script = empytCheck(checkField, scriptSubmit.toString());
		div.bind(SysName.PromptSubmitID,Window_Event.OnClick,script.toString());
	}
	
	/**
	 * 获取进行数据提交之前的数据检查脚本
	 * 适用于检查单个表单的情况
	 * @param inputName  需要检查的输入框页面ID
	 * @param alertInfo  检查不通过提示信息
	 * @param sSubmitScript  检查通过后的执行脚本
	 * @return
	 * @throws ErrorMessage 
	 */
	public static String getValueCheckScript(String inputName,
			String alertInfo,
			String sSubmitScript) throws ErrorMessage{
		KvMap<String, String> field = new KvMap<String, String>();
		field.put(inputName, alertInfo);
		return getValueCheckScript(field,sSubmitScript);
	}
	
	/**
	 * 获取进行数据提交之前的数据检查脚本
	 * @param checkField     checkField<{表单名称,为空的提示信息}>  需要检查的字段
	 * @param sSubmitScript  检查通过后的执行脚本
	 * @return
	 * @throws ErrorMessage 
	 */
	public static String getValueCheckScript(KvMap<String,String> checkField,
			String sSubmitScript) throws ErrorMessage{
		KvMap<Integer, String[]> fieldMap = new KvMap<Integer, String[]>();
		int i = 0;
		String [] fieldDesc = null;
		for(Map.Entry<String, String> field:checkField){
			fieldDesc = new String[2];
			fieldDesc[0] = field.getKey();
			fieldDesc[1] = field.getValue();
			fieldMap.put(i++, fieldDesc);
		}
		return empytCheck(fieldMap, sSubmitScript);
	}
	
	/**
	 * 生成数据提交时空值检查脚本
	 */
	private static String empytCheck(KvMap<Integer,String[]> checkField,
			String sSubmitScript){
		StringBuilder script = new StringBuilder();
		script.append("if(submitcheck('"+getCheckField(checkField)+"')){");
		script.append(sSubmitScript);
		script.append("}else{return;};");
		return script.toString();
	}
	
	/**
	 * 将需要检查的字段分割成 表单名称1^为空的提示信息1&表单名称2^为空的提示信息2....
	 * @param checkField
	 * @return
	 */
	private static String getCheckField(KvMap<Integer,String[]> checkField){
		StringBuilder sb = new StringBuilder();

		for(int i=0;i<checkField.size();i++){
			if(i!=0){
				sb.append("&");
			}
			sb.append(checkField.getByKey(i)[0]);
			sb.append("^");
			sb.append(checkField.getByKey(i)[1]);
		}
		return sb.toString();
	}
}
